from typing import Generic, Optional, TypeVar, List
from pydantic import BaseModel

T = TypeVar('T')


class ApiResponse(BaseModel, Generic[T]):
    """统一API响应格式"""
    code: int
    msg: str
    data: Optional[T] = None

    @staticmethod
    def ok(data: Optional[T] = None, msg: str = "success") -> "ApiResponse[T]":
        """成功响应"""
        return ApiResponse[T](code=200, msg=msg, data=data)

    @staticmethod
    def error(error_code: int, error_msg: str, data: Optional[T] = None) -> "ApiResponse[T]":
        """错误响应"""
        return ApiResponse[T](code=error_code, msg=error_msg, data=data)


# 分页模型
class PageResult(BaseModel, Generic[T]):
    """分页查询结果类"""
    rows: List[T]
    count: int

    def __init__(self, rows: List[T], count: int, **data):
        super().__init__(rows=rows, count=count, **data)

    @staticmethod
    def create(rows: List[T], count: int) -> "PageResult[T]":
        """创建分页结果"""
        return PageResult[T](rows=rows, count=count)


# 字典模型
class DataDict(BaseModel):
    label: str
    value: int | str


# 使用示例
if __name__ == "__main__":
    # 成功响应 - 无数据，默认消息
    response1 = ApiResponse.ok()
    print(response1.model_dump())
    # {'code': 200, 'msg': 'success', 'data': None}

    # 成功响应 - 有数据，默认消息
    user_data = {"id": 1, "name": "张三"}
    response2 = ApiResponse.ok(data=user_data)
    print(response2.model_dump())
    # {'code': 200, 'msg': 'success', 'data': {'id': 1, 'name': '张三'}}

    # 成功响应 - 有数据，自定义消息
    response3 = ApiResponse.ok(data=user_data, msg="用户创建成功")
    print(response3.model_dump())
    # {'code': 200, 'msg': '用户创建成功', 'data': {'id': 1, 'name': '张三'}}

    # 错误响应 - 传入错误码和错误消息
    response4 = ApiResponse.error(400, "参数错误")
    print(response4.model_dump())
    # {'code': 400, 'msg': '参数错误', 'data': None}

    response5 = ApiResponse.error(404, "用户不存在")
    print(response5.model_dump())
    # {'code': 404, 'msg': '用户不存在', 'data': None}

    # 分页查询示例
    print("\n=== 分页查询示例 ===")

    # 创建分页数据
    customers_data = [
        {"cusid": 1, "cusname": "客户A", "telephone": "13800138001"},
        {"cusid": 2, "cusname": "客户B", "telephone": "13800138002"},
        {"cusid": 3, "cusname": "客户C", "telephone": "13800138003"}
    ]

    # 使用PageResult创建分页结果
    page_result = PageResult.create(rows=customers_data, count=100)
    print(f"分页结果: {page_result.model_dump()}")
    # {'rows': [{'cusid': 1, 'cusname': '客户A', 'telephone': '13800138001'}, ...], 'count': 100}

    # 将分页结果包装在ApiResponse中
    page_response = ApiResponse.ok(data=page_result, msg="查询成功")
    print(f"分页响应: {page_response.model_dump()}")

    # 类型安全示例
    # 指定具体类型 - 字典列表的分页结果
    dict_page_result: PageResult[dict] = PageResult.create(rows=customers_data, count=100)

    # 指定具体类型 - 字符串列表的分页结果
    string_data = ["item1", "item2", "item3"]
    string_page_result: PageResult[str] = PageResult.create(rows=string_data, count=50)

    print("\n=== 类型安全示例 ===")
    print(f"字典分页: {dict_page_result.model_dump()}")
    print(f"字符串分页: {string_page_result.model_dump()}")

    # 完整的API响应示例
    final_response: ApiResponse[PageResult[dict]] = ApiResponse.ok(
        data=dict_page_result,
        msg="客户列表查询成功"
    )
    print(f"\n最终API响应: {final_response.model_dump()}")
